加密与解密 第2篇 调试篇

第三章 静态分析技术

3.1 文件类型分析

3.1.1 PEiD工具

  • option -> register shell extensions
  • 扩展文件接口 userdb.txt,可以自定义一些特征码,识别出新的文件类型
  • 签名制作插件:add signature,配合od修正

3.1.2 fileinfo工具

3.2 静态反汇编

3.2.1 反汇编引擎

  • udis86
  • ade
  • xde
  • mlde32
  • virxasm
  • od插件:FullDisasm

3.2.2 ipa pro简介

  • 分析过程分2个阶段

  • 将程序和代码分开

    为函数做标记并分析其参数调用

    分析跳转、调用等指令关系并给标签赋值等

  • 识别出文件的编译类型,装载对应的编译器特征文件,给各函数赋名

  • 加载出现错误

  • ida分析出有问题的代码

    关闭 Kernel Options1->make final analysis pass

  • 一些代码不在预计的位置而不被确认

    关闭Kernel Options2->coagulate data segments in the final pass

3.2.3 ida配置

  • idag.cfg文件

  • 编辑工具:editplus、Ultraplus

  • 组成:

  • 定义文件的扩展名、内存、屏幕等

  • 配置普通参数:代码显示格式、ascii字符显示格式、脚本定义、处理器选项

  • 一些问题

max_item_lines :默认5000,许多大文件不够用

  • 选项

  • 反汇编选项

  • ascii字符串与符号
  • 显示中文字符

3.2.4 IDA主窗口界面

3.2.5 交叉参考

  • X键: 打开交叉参考窗口

3.2.6 参考重命名

  • N键

3.2.7 标签的用法

  • ctrl+M:跳到标记位置

3.2.8 进制的转换

3.2.9 代码和数据转换

  • C键:切换为指令
  • P键:定义为子程序
  • U键:重新以16进制数显示
  • D键:db、dw、dd之间转换

3.2.10 字符串

  • A键:弹出ida支持的字符串格式
  • G键:跳转到某一地址
  • 空格键:切换流程图和反汇编模式
  • N键:重命名地址为某字符串

3.2.11 数组

  • edit/array 小键盘*:weary:

3.2.12 结构体

  • shift+F11:加载类型库窗口 -> intert键:可用的类型库窗口

  • shift+F9: 结构体管理窗口-> insert键:增加结构体-> add standart structure

  • ida 版本=5.x,shift+F9: 结构体管理窗口-> insert键-> cancel,结构体数据会显现出来

  • +键,展开结构体,但是貌似只有在小键盘上有效?笔记本悲催:sweat:

  • 结构体定义详细解释

  • alt+Q: 在反汇编窗口中对数据应用结构体

  • T键:在操作数类型中应用结构体

  • 批量替换结构体:选中需要替换的部分,T键,然后替换

  • 从已经分析好的数据中建立结构体,选择好分析好的数据后:

edit/structs/create from data

  • 在结构体中嵌套结构体union(共用体)

在结构体窗口中使用alt+Q

  • 从c文件头中导入结构 load file/parse c header file

3.2.13 枚举类型

  • shift+F10:打开枚举类型窗口
  • insert添加
  • 在代码窗口,M键替换
  • 支持bit-fileds类型

3.2.14 堆栈变量

  • ctrl+k:打开堆栈窗口

3.2.15 IDC脚本

实例1 查看输入函数
//Imports.idc 列出当前程序的输入函数
//(c)  www.PEDIY.com 2000-2008

#include <idc.idc>

static GetImportSeg()
{
    auto ea, next, name;
    ea = FirstSeg();
    next = ea;
    while ( (next = NextSeg(next)) != -1) {
        name = SegName(next);
        if ( substr( name, 0, 6 ) == ".idata" ) break;
   }
   return next;
}

static main()
{
    auto BytePtr, EndImports;
    BytePtr = SegStart( GetImportSeg() );
    EndImports = SegEnd( BytePtr );
    Message(" \n" + "Parsing Import Table...\n");
    while ( BytePtr < EndImports ) {
        if (LineA(BytePtr, 1) != "") Message("\n" + "____" + LineA(BytePtr,1) + "____" + "\n");
        Message(Name(BytePtr) + "\n");
        BytePtr = NextAddr(BytePtr);
    }
    Message("\n" + "Import Table Parsing Complete\n");
}
  • 导入idc脚本

File/idc file

实例2 用idc分析加密代码
  • SMC(self modifying code)

```c //encrypted.idc //(c) www.PEDIY.com 2000-2008

#include static decrypt(from, size, key ) { auto i, x; for ( i=0; i < size; i=i+1 ) { x = Byte(from); x = (x^key); PatchByte(from,x); from = from + 1; }

} ```

  1. file/idc file引入idc文件

  2. shift+F2执行idc函数

    c decrypt(0x00401060,0x15,0x1)

  3. U将所有代码以数据形式显示出来

  4. C将此段代码重新分析

  5. 结合od

通过ida的additional binary file的功能将od解码出的文件重新加载

  • 脚本工具:IDApython、IDAperl

3.2.16 FLIRT

  • fast library identificaiton and recongnition technology

  • 签名文件格式:.sig

  • shift+F5:打开签名窗口

insert打开文件列表窗口,选中签名文件,然后激活

应用后,将自动重新分析全部代码

如果没有自动分析,options/analysis-> reanalyse program

  • 签名文件的制作:

  • 有lib文件的情况

    1. pcf转换

    pcf *.lib *.pat

    1. sigmake转换

    sigmake *.pat *.sig

  • 没有lib,只有dll

    1. 反汇编该dll
    2. idb2pat插件生成pat
    3. sigmake签名

3.2.17 插件

  • hex-rays decomplier 反汇编成高级语言

3.2.18 其他功能

  1. 图形化模式

  2. 加载符号文件

load file/pdb file 自动从微软官网寻找最合适当前版本的pdb或dbg

  1. api帮助关联

  2. 将idagui.cfg中的helpfile指向本地windows api帮助文件

  3. ctrl + F1实现查询

  4. 文件输出

file/produce file

  1. map文件

    各函数等符号信息

  2. asm文件

    仅输出汇编文件部分

  3. dump database to IDC file

    低版本向高版本恢复当前使用数据

  4. dump typeinfo to IDC file

    将用户自定义的数据类型保存到IDC文件

3.3 可执行文件的修改

hiew

  • 快捷键
按键 功能
F5 跳转到地址(支持相对地址和虚拟地址(前面加上.))
F1 帮助
F3 进入编辑状态
F2 修改汇编代码
F9 保存

3.4 静态分析技术应用实例

3.4.1 解密初步

3.4.2 逆向工程初步

1. 移除"mission failed"对话框
  1. IDA查看string窗口
  2. 双击字符“...mission failed...”,到代码处
  3. 双击交叉引用,记下地址
  4. 在OD中跳转到此地址,可nop掉,也可jump掉过,此处跳过,在push 0处,修改为jmp 0040124E
2. 将输入字符显示到对话框
  1. 在IDA name窗口中,双击GetWindowTextA的调用处
  2. 发现有两次调用,第一处比较可疑,进入
  3. OD将jmp eaxnop掉,就可以执行下面的程序,GetWindowTextA将文本空间内容放到缓冲区,MessageBoxA从缓存区中读取文本并显示到消息框中
3. 修改字符

​ 修改指定的字符串

  1. 查找指定字符串的两种方式

    1. IDA-> shift+F12

    2. OD -> 鼠标右键-Search for-All referenced text strings

    OD ->鼠标右键-中文搜索-智能搜索 -> CTRL+F

    ida给出的结果会更符合要求,OD给出了太多的结果

        **new: 智能搜索更好用**
    
    1. 在ida中找到字符串之后,在od跳转到该地址

    2. 在该处右键-> follow dump-> selection,会在内存窗口中看到该字符串

    3. ctrl+e修改,可以在notepad中写好,然后使用shift+insert粘贴

    4. 选中修改部分,右键->copy to executalbe file

    5. 在弹出的窗口中,选择修改后的部分,右键->save file

4. 完成序列号验证
  1. 找到合适的地址

  2. 在od中修改,代码如下

?不知道有没有一次性复制粘贴的办法

x86asm cmp ecx,5 jnz 4012CD mov edx,403000 mov bl,[eax] mov bh,[edx] cmp bl,bh jnz 4012CD inc eax inc edx dec ecx jz 4012B8 jmp 40127A

  1. 保存

3.5 补充

3.5.1 快捷键

功能键 功能
R 将16机制码以字符串形式解读
F5 显示反汇编的源码
shift+F12 显示strings窗口
alt+T 文本搜索
ctrl+T 继续下一个查找
alt+B 二进制搜索
B 2/16进制转换
A 解释光标处的地址为一个字符串的首地址
H 16/10进制转换
注释
X 转换视图为交叉参考模式
shift+E 提取数据
shift+F1 导出数据
  • F5:查看源代码的过程中,及时将变量名(N键)改为有意义的名称
  • 函数窗口:红色的无法反汇编成源码,白色的可以